#pragma once

#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>

enum MSG_TYPE
{
    REGISTER = 0,
	REGISTER_RESPONSE,
	LOGIN,
	LOGIN_RESPONSE,
	GETFRIEND,
	GETFRIEND_RESPONSE,
	SEND_MSG,
	SEND_MSG_RESPONSE,
	PUSH_MAG,
	ADDFRIEND,
	PUSH_ADDFRIEND,
    ADDFRIEND_RESPONSE,
    EXIT
};

enum RESPONSE_TYPE
{
    REGISTER_SUCCESS = 0,
	REGISTER_FAIL,
	LOGIN_SUCCESS,
	LOGIN_FAIL,
	GETFRIEND_SUCCESS,
	GETFRIEND_FAIL,
	SEND_MSG_SUCCESS,
	SEND_MSG_FAIL,
	ADDFRIEND_RESPONSE_SUCCESS,
	ADDFRIEND_RESPONSE_FAIL
};

//自定义协议
class CMsg
{
public:
    CMsg();
    ~CMsg();
    //消息类型
    CMsg(enum MSG_TYPE msg_type);
public:
    //将字符串反序列化成为CMsg
    bool ParseString(int socket_fd, std::string& body);
    //将CMsg序列化成为字符串  
    bool GetString(std::string& body);
    //设置json消息
    void SetNameValue(const std::string& name, const std::string val);
    void SetNameValue(const std::string& name, int val);
    //获取CMsg中msg_["name"]的值
    std::string GetValue(const std::string& name);
    //清除掉除了socket的以外的信息，方便复用
    void Clear();
private:
    //Json序列化
    bool Serialize(const Json::Value& value, std::string& body);
    //Json反序列化
    bool UnSerialize(const std::string& body, Json::Value& value);
public:
    //供服务端接收线程将接收到的就绪描述符存入，方便发送线程使用
    int socket_fd_;

    int user_id_;

    //消息类型
    int msg_type_;
    //服务端响应类型
    int response_;
    //json消息
    Json::Value msg_;
};